package com.canbot.u05.view;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import com.canbot.u05.R;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

import java.security.MessageDigest;

public class GlideCircleTransform extends BitmapTransformation {

        private Context context;

        public GlideCircleTransform(Context context){
                super();
                this.context = context;
        }

        @Override
        protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
//                return circleCrop(pool,toTransform);
                return getCroppedRoundBitmap(toTransform,(int) context.getResources().getDimension(R.dimen.px260));
        }

        @Override
        public void updateDiskCacheKey(MessageDigest messageDigest) {

        }

        private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
                if (source == null) return null;

                int size = Math.min(source.getWidth(), source.getHeight());
                int x = (source.getWidth() - size) / 2;
                int y = (source.getHeight() - size) / 2;

                Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

                Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
                if (result == null) {
                        result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
                }

                Canvas canvas = new Canvas(result);
                Paint paint = new Paint();
                //画布中背景图片与绘制图片交集部分
                paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
                paint.setAntiAlias(true);
                float r = size / 2f;
                canvas.drawCircle(r, r, r, paint);
                return result;
        }

        public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
                Bitmap scaledSrcBmp;
                int diameter = radius * 2;
                // 为了防止宽高不相等，造成圆形图片变形，因此截取长方形中处于中间位置最大的正方形图片
                int bmpWidth = bmp.getWidth();
                int bmpHeight = bmp.getHeight();
                int squareWidth = 0, squareHeight = 0;
                int x = 0, y = 0;
                Bitmap squareBitmap;
                if (bmpHeight > bmpWidth) {// 高大于宽
                        squareWidth = squareHeight = bmpWidth;
                        x = 0;
                        y = (bmpHeight - bmpWidth) / 2;
                        // 截取正方形图片
                        squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
                }
                else if (bmpHeight < bmpWidth) {// 宽大于高
                        squareWidth = squareHeight = bmpHeight;
                        x = (bmpWidth - bmpHeight) / 2;
                        y = 0;
                        squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
                }
                else {
                        squareBitmap = bmp;
                }
                if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {
                        scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);
                }
                else {
                        scaledSrcBmp = squareBitmap;
                }
                Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),
                        scaledSrcBmp.getHeight(),
                        Bitmap.Config.ARGB_8888);
                Canvas canvas = new Canvas(output);

                Paint paint = new Paint();
                Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());

                paint.setAntiAlias(true);
                paint.setFilterBitmap(true);
                paint.setDither(true);
                canvas.drawARGB(0, 0, 0, 0);
                canvas.drawCircle(scaledSrcBmp.getWidth() / 2,
                        scaledSrcBmp.getHeight() / 2,
                        scaledSrcBmp.getWidth() / 2,
                        paint);
                paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
                canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
                bmp = null;
                squareBitmap = null;
                scaledSrcBmp = null;
                return output;
        }

}
